package main

import "fmt"

func main() {
	/*
		数组
		数组是长度固定的数据类型，元素和类型都是一样的
		数组在内存之中是连续的存储空间，可以有效的提升 CPU 的执行效率
		整型：默认值0
		字符串：默认值 ""
		bool: 默认值 false
	*/

	var array [10]int
	// 变量或者数组在定义时，如果没有赋值，会有默认值（零值）
	array[0] = 100
	array[3] = 200
	// array[10] = 100  越界，不能这样定义
	fmt.Println(array)
	// [100 0 0 200 0 0 0 0 0 0]

	var array2 [5]int = [5]int{1, 2, 3, 4, 5}
	var length = len(array2)
	for i := 0; i < length; i++ {
		fmt.Printf("array2[%d]=%d,地址=%p\n", i, array2[i], &array2[i])
		/*
			array2[0]=1,地址=0xc0000ac060
			array2[1]=2,地址=0xc0000ac068
			array2[2]=3,地址=0xc0000ac070
			array2[3]=4,地址=0xc0000ac078
			array2[4]=5,地址=0xc0000ac080
			证明数组中是连续存放的，占 8 个字节
		*/
	}

	// 数组定义方式2
	// 这种写法会自动推断出数组的长度
	// int[10] 和 int[5] 是两种不同的数组
	array3 := [...]int{1, 2, 3, 4, 5}
	fmt.Println(array3, len(array3))
	// [1 2 3 4 5] 5

	// 数组的定义方式3
	array4 := [...]int{0: 1, 1: 2, 10: 3}
	fmt.Println(array4, len(array4))
	// [1 2 0 0 0 0 0 0 0 0 3] 11

	// 数组是值类型
	array5 := [10]int{1, 2, 3}
	fmt.Println(array5) // [1 2 3 0 0 0 0 0 0 0]
	changeArray(array5)
	fmt.Println(array5) // [1 2 3 0 0 0 0 0 0 0]
	// 改变失败，因为传递的是数组的原始值拷贝，此时在函数内部是无法更新该数组的
	// 即只传递值，不传递完整内容

	// 如果想通过函数的方式改变数组的元素，需要传递数组指针来改变
	changeArrayByPointer(&array5)
	fmt.Println(array5) // [100 2 3 0 0 0 0 0 0 0]
	// 改变成功
}

func changeArray(arr [10]int) {
	arr[0] = 100
	fmt.Println("modify a = ", arr)
	// [100 2 3 0 0 0 0 0 0 0]
}

func changeArrayByPointer(arr *[10]int) {
	(*arr)[0] = 100
}
